package db

import (
    "gopkg.in/mgo.v2"
    "github.com/name5566/leaf/log"
    "github.com/name5566/leaf/db/mongodb"
	"github.com/name5566/leaf/util"
)

var DB *mongodb.DialContext

const (
	TBL_COUNTER = "tbl_counter"    // 维护自增id的表

	DB_URL = "127.0.0.1"	// 数据库地址（将来配置在json中）
	DB_NAME = "poker"	// 数据库名字
)

func init() {
	// mongodb
	db, err := mongodb.Dial(DB_URL, 100)
	if err != nil {
		log.Fatal("dial mongodb error: %v", err)
	}

	DB = db

    // 初始化各个表
    initTables()
}

// 关闭所有数据库连接
func DBDestroy() {
	DB.Close()
	DB = nil
}

// 给表建立索引，提高查询速度
func DBEnsureIndex(tblName string, fieldName string, unique bool) {
	if unique {
		err := DB.EnsureUniqueIndex(DB_NAME, tblName, []string{fieldName})
		if err != nil {
			log.Fatal("ensure index error: %v", err)
		}
	} else {
		err := DB.EnsureIndex(DB_NAME, tblName, []string{fieldName})
		if err != nil {
			log.Fatal("ensure index error: %v", err)
		}
	}
}

//建立自增id表
func DBEnsureCounter(tblName string, startIndex int) {
	err := DB.EnsureCounter(DB_NAME, TBL_COUNTER, tblName)
	if err != nil {
		log.Fatal("ensure counter error: %v", err)
	}
}

// 获取下一个id
func DBNextSeq(id string) (int, error) {
	return DB.NextSeq(DB_NAME, TBL_COUNTER, id)
}

// 查找对象
func DBFind(tblName string, key map[string]interface{}, result interface{}) interface{} {
	session := DB.Ref()
	defer DB.UnRef(session)

	err := session.DB(DB_NAME).C(tblName).Find(key).One(result)
	if err != nil {
		if err != mgo.ErrNotFound {
			log.Error("DBFind error:  %v  %v  %v", tblName, key, err)
		}

		// 没有这个对象
		return nil
	}

	return result
}

// 创建一个新的对象
func DBInsert(tblName string, newData interface{}) error {
	session := DB.Ref()
	defer DB.UnRef(session)

	collection := session.DB(DB_NAME).C(tblName)
	err := collection.Insert(newData)
	if err != nil {
		log.Error("DBInsert Error:  %v %v", tblName, err)
		return err
	}

	return nil
}

// 保存一个数据
func DBSave(tblName string, id interface{}, data interface{}) error {
	cloneData := util.DeepClone(data)

	session := DB.Ref()
	defer DB.UnRef(session)

	_, err := session.DB(DB_NAME).C(tblName).UpsertId(id, cloneData)
	if err != nil {
		log.Error("DBSave error  %v  %v", id, err)
		return err
	}
	return nil
}

// 每个表的初始化在这里调用
func initTables() {
    initAccount()
}